/**
 * @file mat_funs.c
 *
 *  Created on: Mar 29, 2010
 *      Author: Marco Luisi
 */


//una extern per la lista matrici
#include "mat_funs.h"
#include "util.h"


////
/// 	Da fare una funzione che scorre la lista, da usare per lista mat e ricerca per cancellazione
/////
///







/**
 *
 * @param m
 */
void printMat(matrix_t *m){
	int i, j;
	printf("printMat: %s:%d-%d\n",m->name,m->rows,m->columns);
	printf("---------------------\n");

	for(i=0; i<m->rows;i++){
		for(j=0; j < m->columns;j++){
			printf("%f ",m->mat[i][j]);
		}
		printf("\n");
	}

	printf("---------------------\n");
}

/**
 * @brief Inserisce una matrice nella lista delle matrici in memoria.
 *
 * @param name
 * @param r
 * @param c
 * @param numbers
 */
int addMat(matrix_l **list, matrix_t *m){

	matrix_l *temp;
	matrix_l *r;

	temp = *list;

	/**
	 * lista vuota
	 */
	if( *list== NULL ){
		//fare macro msg errori
		printf("lista vuota\n");
		EC_NULL_E( temp  = malloc(sizeof(matrix_l)), "errore di memoria");
		temp->matrix =m;
		temp->next = NULL;
		*list = temp;
	}
		/**
		 * list non vuota
		 */
	else {
		printf("lista NON vuota\n");
		while(temp->next != NULL){
			temp = (matrix_l*)temp->next;
		}
		EC_NULL_E( r  = (matrix_l*) malloc(sizeof(matrix_l)), "errore di memoria");
		r->matrix = m;
		r->next = NULL;
		temp->next = (matrix_l*)r; //come togliere questo warning?

	}

	return 1;
}

/**
 *
 * @param name
 * @param r
 * @param c
 * @param numbers
 * @return
 */
matrix_t* newMat(char *name,int r, int c, double **numbers){

	matrix_t* m;
	EC_NULL_E(m = malloc(sizeof(matrix_t)),"errore allocazione memoria");
	m->name = strndup(name,NAMELEN); //ec
	m->rows = r;
	m->columns = c;
	if(numbers == NULL){
		return m;
	}
	m->mat = numbers;
	return m;
}

/**
 *
 * @param list
 */
void listMat(matrix_l *list){ //poi dovrà dare un buffer da passare al comando che poi lo spedisce

	//contatore?
	if (list == NULL){
		printf("lista vuota\n");
		return;
	}

	while(list != NULL) {
		printMat(list->matrix);
		list=list->next;

	}
 return;
}





matrix* allocateMat(int rows, int cols){
	int i;
	matrix *mat;
	elem* p;

	///alloca un blocco di memoria per tutta la matrice
	EC_NULL_E(p = calloc(rows * columns * sizeof(elem));

	///alloca lo spazio per le righe
	EC_NULL_E(mat = calloc(rows * sizeof(row));
	///per ogni riga alloca lo spazio per gli elementi
	for( i = 0; i < cols; i ++){
		mat[i] = p + ((i - 1) * rows)  - 1;
	}
	return *mat;
}

void releaseMat(matrix m){
	elem *p;
	p = (elem *) m[0];
	free(p);
}




int addMat(matrix_t *a,matrix_t *b, matrix_t *res){

	///controllo preliminare degli operandi
	if ((a->rows != b->rows) || (a->columns != b->columns)){
		res = NULL;
	}

	if(res != NULL){

	}
	else{
		//res = malloc()
	}


}

int subMat(matrix_t *a,matrix_t *b,matrix_t *res){

	///controllo preliminare degli operandi
	if ((a->rows != b->rows) || (a->columns != b->columns)){
		res = NULL;
	}

}

int mulMat(matrix_t *,matrix_t *,matrix_t *){

}

int trasp(matrix_t *,matrix_t *){


}



